package com.xinqi.modules.course.clazz.service;

import com.xinqi.common.base.data.ListDataDTO;
import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.modules.course.clazz.domain.ClassJoinAuditEntity;
import com.xinqi.modules.course.clazz.dto.req.*;
import com.xinqi.modules.course.clazz.dto.rsp.ClassJoinAuditResultDTO;
import com.xinqi.modules.course.course.enums.clazz.ClassAuditStatusEnum;

import java.util.List;

/**
 * 学生加入班级审核服务层
 *
 * @author: system
 * @date: 2023/01/17
 */
public interface ClassJoinAuditService {
    /**
     * 分页查询 学生加入班级审核数据
     */
    PageInfo<ClassJoinAuditResultDTO> page(Param pageable, ClassJoinAuditQueryDTO query);

    /**
     * 查询 学生加入班级审核数据
     */
    List<ClassJoinAuditResultDTO> find(ClassJoinAuditQueryDTO query);

    List<ClassJoinAuditResultDTO> findList(ClassJoinAuditQueryDTO query);

    /**
     * 根据id查询 学生加入班级审核数据
     */
    ClassJoinAuditResultDTO findById(Long id);

    /**
     * 新增 学生加入班级审核数据
     */
    Long insert(ClassJoinAuditCreateDTO dto);

    /**
     * 根据id修改 学生加入班级审核数据
     */
    Boolean updateById(ClassJoinAuditUpdateDTO dto);

    /**
     * 根据id删除 学生加入班级审核数据
     */
    Boolean deleteById(Long id);

    /**
     * 根据id删除 学生加入班级审核数据
     */
    Boolean deleteById(ClassJoinAuditDeleteDTO dto);

    ClassJoinAuditResultDTO detail(Long id);

    ClassJoinAuditResultDTO apply(ClassJoinAuditCreateDTO dto);

    Boolean accept(Long auditId);

    Boolean reject(Long auditId);

    ClassJoinAuditResultDTO findByClassIdAndStudentId(Long classId, Long studentId);

    List<ClassJoinAuditResultDTO> findByClassIdAndStudentIdList(Long classId, List<Long> studentIdList);

    /**
     * app端批量审核
     *
     * @param dto
     * @return
     */
    Boolean batchAccept(ListDataDTO<Long> dto);

    /**
     * pc端批量审核
     *
     * @param dto
     * @return
     */
    Boolean batchAccept(List<ClassJoinAuditUpdateDTO> dto);

    /**
     * pc端批量审核
     *
     * @param dto
     * @return
     */
    Boolean batchReject(ListDataDTO<Long> dto);

    /**
     * pc端批量审核
     *
     * @param dto
     * @return
     */
    Boolean batchReject(List<ClassJoinAuditUpdateDTO> dto);

    ClassJoinAuditResultDTO findLatestStatusByUserIdAndClassId(Long studentId, Long classId);

    /**
     * 待审核、已审核数量
     *
     * @param dto
     * @return
     */
    Integer count(ClassJoinAuditQueryDTO dto);

    /**
     * 获取班级下待审核的学生数量，与班级设置的自动审核、手动审核无关
     *
     * @param classId 班级id
     * @return 待审核的数量
     */
    Long findNotAuditCountByClassId(Long classId);

    /**
     * 如果有审核记录就更新，否则更新，始终保证一个班级下每个学生的审核数据只有一条
     *
     * @param classId         班级id
     * @param studentId       学生id
     * @param auditUserId     审核人id
     * @param auditContent    审核内容
     * @param auditStatusEnum 审核状态
     * @return 返回审核id
     */
    Long saveOrUpdateByClassIdAndStudentId(Long classId, Long studentId, Long auditUserId, String auditContent, ClassAuditStatusEnum auditStatusEnum);

    /**
     * 批量添加
     *
     * @param list
     * @return 返回审核结果
     * @Author dzy
     */
    boolean saveAllBatch(List<ClassJoinAuditEntity> list);

    void deleteByClassIdAndStudentIdList(Long classId, List<Long> studentIdList);

    ClassJoinAuditResultDTO applyByPhone(ClassJoinAuditApplyByPhoneDTO dto);

}
